package find.indices.that.is.equal.value;

import java.util.HashMap;

/**
 * @Time 2019/12/19
 * @author 王光浩
 * @Need   给定一个整数数组和一个目标target，在数组中找出两个数值相加为target的下标（不能使用到同一个下标的元素两次）
 * @Method 使用HashMap，key值为对应的数组元素值，value为元素值对应的下标。
 *         与MyMethod中的不同点是：在该方法中只使用了一遍循环。在将数据存储在HashMap的过程中，判断在HashMap中是否存在
 *         一个与即将要存储的值相加等于target的key，如果存在的话取出对应的value，将value和即将要存储数据的下标返回。
 *         原理：在MyMethod方法中，我们是先将所有数据加入到HashMap中，然后在通过循环遍历数组来判断是否存在两个数组值相加
 *               为target的下标，这样做有一个缺点就是重复运算，我们将target-第一个数和HashMap中所有元素比较，然后又将
 *               target-第二个数和HashMap中的数据进行比较，由于在第一个数的比较过程中我们已经确定了第一个数和第二个数相加
 *               不等于target（这里假设最后两个下标的产生不是来自于第一个元素和第二个元素），所以在第二个数的比较过程中又和
 *               第一个数进行了相加判断所有这里重复了。改进之后，我们每加入一个数据都会将判断HashMap中是否存在target-即将加入
 *               数据，如果存在则返回对应的值。
 */
public class OtherMethod {
    public int[] twoSum(int[] nums, int target) {
    	HashMap<Integer,Integer> hashMap=new HashMap<Integer,Integer>();
    	int len=nums.length;             //保存数组长度
    	for(int i=0;i<len;i++) {
    		if(hashMap.get(target-nums[i])!=null) {
    			return new int[] {hashMap.get(target-nums[i]),i};
    		}
    		hashMap.put(nums[i], i);
    	}
    	throw new IllegalArgumentException("no such two indexs");
    }

}
